#include "BSP/SD/sdcard.h"

uint8_t sd_status = 0;

/**
* @brief       初始化SD卡 sdio接口
* @param       无
* @retval      返回值:0 初始化正确；其他值，初始化错误
*/
uint8_t sd_init(void)
{
   uint8_t res = 1;

   res = SD_INIT_FUN();
   
   return res;
}

/**
* @brief       读SD卡(fatfs/usb调用)
* @param       pbuf  : 数据缓存区
* @param       saddr : 扇区地址
* @param       cnt   : 扇区个数
* @retval      0, 正常;  其他, 错误代码;
*/
uint8_t sd_read_disk(uint8_t *pbuf, uint32_t saddr, uint32_t cnt)
{
   uint8_t sta = HAL_OK;
   uint32_t timeout = SD_CARD_TIMEOUT;
   long long lsector = saddr;

   SD_ENTER_CRITICAL();                                       /* 关闭总中断(POLLING模式,严禁中断打断SDIO读写操作!!!) */
   sta = SD_READ_BLOCKS(pbuf, lsector, cnt, SD_CARD_TIMEOUT); /* 多个sector的读操作 */

   /* 等待SD卡读完 */
   while (SD_GET_STATE() != SD_CARD_TRANSFER_OK)
   {
       if (timeout-- == 0)
       {
           sta = SD_CARD_TRANSFER_BUSY;
       }
   }
   SD_EXIT_CRITICAL(); /* 开启总中断 */

   return sta;
}

/**
* @brief       写SD卡(fatfs/usb调用)
* @param       pbuf  : 数据缓存区
* @param       saddr : 扇区地址
* @param       cnt   : 扇区个数
* @retval      0, 正常;  其他, 错误代码;
*/
uint8_t sd_write_disk(uint8_t *pbuf, uint32_t saddr, uint32_t cnt)
{
   uint8_t sta = HAL_OK;
   uint32_t timeout = SD_CARD_TIMEOUT;
   long long lsector = saddr;

   SD_ENTER_CRITICAL();                                        /* 关闭总中断(POLLING模式,严禁中断打断SDIO读写操作!!!) */
   sta = SD_WRITE_BLOCKS(pbuf, lsector, cnt, SD_CARD_TIMEOUT); /* 多个sector的写操作 */

   /* 等待SD卡写完 */
   while (SD_GET_STATE() != SD_CARD_TRANSFER_OK)
   {
       if (timeout-- == 0)
       {
           sta = SD_CARD_TRANSFER_BUSY;
       }
   }
   SD_EXIT_CRITICAL(); /* 开启总中断 */

   return sta;
}
